package pms.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.StrutsStatics;

import pms.common.service.UserAuthService;
import pms.common.utils.Consts;
import pms.common.utils.PMSLog;
import pms.common.utils.StringValidator;
import pms.common.value.UserSessionValue;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class UserAuthInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = -6251983387307904052L;
	
	/** ユーザー認証サービス */
	private UserAuthService userAuthService;

	public UserAuthService getUserAuthService() {
		return userAuthService;
	}

	public void setUserAuthService(UserAuthService userAuthService) {
		this.userAuthService = userAuthService;
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		PMSLog.start();
		//セッション取得
		ActionContext l_actionContext = invocation.getInvocationContext();   
        HttpServletRequest l_request= (HttpServletRequest) l_actionContext.get(StrutsStatics.HTTP_REQUEST);
        HttpSession l_session = l_request.getSession(true);
        
        //セッションから認証データ取得
        String l_sessionAuthValue = (String)l_session.getAttribute(Consts.USER_AUTH_KEY);
        
        if(l_sessionAuthValue == null) {
        	//認証データがない場合、請求先URLを格納し、ログイン画面へ遷移する
        	setReturnUrl(l_session, invocation);
        	PMSLog.debug("認証データがないため、ログイン画面へ遷移する。");
        	PMSLog.end();
        	return "global_login";
        } else {
        	//認証データがある場合、認証サービスより認証する
        	PMSLog.debug("セッションから取得した認証データ：" + l_sessionAuthValue);
        	String[] l_authString = l_sessionAuthValue.split(":");
        	//認証データのフォーマットをチェックする。
        	if(l_authString.length != 2) {
        		throw new Exception("CM0001E");//認証データフォーマットエラー
        	}
        	UserSessionValue l_userSessionValue = userAuthService.authUser(l_authString[0], l_authString[1]);
        	if(l_userSessionValue != null) {
        		PMSLog.debug("セッションデータ認証OK。");
        		l_session.setAttribute(Consts.USER_SESSION_KEY, l_userSessionValue);
        		PMSLog.end();
        		return invocation.invoke();
        	} else {
        		PMSLog.debug("セッションデータ認証エラー、ログイン画面へ遷移");
        		setReturnUrl(l_session, invocation);
            	PMSLog.end();
            	return "global_login";
        	}
        }
	}
	
	private void setReturnUrl(HttpSession session, ActionInvocation invocation){
		PMSLog.start();
        String url = "";   
        String namespace = invocation.getProxy().getNamespace();   
        if (!StringValidator.isEmpty(namespace) && !namespace.equals("/")){   
            url = url + namespace;   
        }   
        String actionName = invocation.getProxy().getActionName();   
        if (!StringValidator.isEmpty(actionName)){
        		url = url + actionName + ".action";
        }
        session.setAttribute(Consts.RETURN_URL_KEY, url);   
        PMSLog.debug("ReturnURL保存OK：" + url);
        PMSLog.end();
    }

	

}
